﻿#include <iostream>
#include <array>
#include <vector>

int main()
{

	/*
	* 数组的特点：
	1，类型安全：std::array 强制类型检查，避免了 C 语言数组的类型不安全问题。
	2，固定大小：数组的大小在编译时确定，不能在运行时改变。
	3，内存连续：std::array 的元素在内存中是连续存储的，这使得它可以高效地访问元素。
	4，标准容器：std::array 提供了与 std::vector 类似的接口，如 size(), at(), front(), back() 等。
	*/

	std::array<int, 5> arr = { 1, 2, 3, 4, 5 }; // 声明一个定长为5的int数组

	//遍历数组
	for (const auto& v : arr)
	{
		std::cout << v << ",";
	}
	std::cout << "\n";


	// 使用索引访问数组元素
	std::cout << "使用索引 2 访问数组元素 : " << arr.at(2) << std::endl;

	// 获取数组的大小
	std::cout << "数组的大小: " << arr.size() << std::endl;

	// 修改数组元素
	arr[3] = 10;

	// 再次遍历数组以显示修改后的元素
	for (const auto& value : arr) {
		std::cout << value << " ";
	}
	std::cout << std::endl;


	// 获取第一个和最后一个元素
	std::cout << "First element: " << arr.front() << std::endl;
	std::cout << "Last element: " << arr.back() << std::endl;



	std::array<int, 5> arr2;
	arr2.fill(100);  // 将所有元素设置为100

	std::cout << "Filled array: ";
	for (const auto& elem : arr2) {
		std::cout << elem << " ";
	}
	std::cout << std::endl;



	//数组交换
	arr.swap(arr2);

	std::cout << "Array 1: ";
	for (const auto& elem : arr) {
		std::cout << elem << " ";
	}
	std::cout << std::endl;

	std::cout << "Array 2: ";
	for (const auto& elem : arr2) {
		std::cout << elem << " ";
	}
	std::cout << std::endl;


	//容器类 <vector>
	std::vector<int> v1;// 空的vector
	v1.reserve(10);  // 预留容量，避免频繁分配内存

	v1.push_back(1); //添加元素
	int ev = v1[0];  //访问元素
	int size = v1.size(); //容器大小
	v1.push_back(2);//	在末尾添加元素
	v1.pop_back();//	删除末尾元素
	v1.at(0);//	返回指定位置的元素，带边界检查
	v1[1];//返回指定位置的元素，不带边界检查
	v1.front();//返回第一个元素
	v1.back();//返回最后一个元素
	v1.data();//返回指向底层数组的指针
	v1.size();//返回当前元素数量
	v1.capacity();//返回当前分配的容量
	v1.reserve(3);//预留至少 n 个元素的存储空间
	v1.resize(6);//将元素数量调整为 n
	v1.clear();//清空所有元素

	v1.begin();// 返回起始
	v1.end();// 结束迭代器

	std::cout << "遍历 vector 中的元素: ";
	for (int i = 0; i < v1.size(); ++i) {
		std::cout << v1[i] << " ";
	}
	std::cout << std::endl;




	// 清空 vector
	v1.clear();
	// 检查 vector 是否为空
	if (v1.empty()) {
		std::cout << "The vector is now empty." << std::endl;
	}



	  /* 与其他容器对比
	   特性					std::vector					std::array		std::list
	   大小					动态可变					编译时固定		动态可变
	   存储位置				连续内存						连续内存	非连续内存
	   访问性能				随机访问快速				随机访问快速	随机访问慢，适合顺序访问
	   插入和删除性能	末尾操作性能高，其他位置较慢	不支持			任意位置插入和删除较快
	   内存增长方式			容量不足时成倍增长			无					无
	   
	   <vector> 是 C++ STL 中一个非常有用的容器，它提供了动态数组的功能，
	   使得元素的添加和删除变得更加灵活和方便。通过上述示例，
	   初学者可以快速了解 <vector> 的基本用法和操作。随着学习的深入，
	   你将发现 <vector> 在实际编程中的强大功能和广泛应用。
		   
	   */
}
